#include <iostream>
using namespace std;
namespace SortTestHelper
{
  // 生成有n个元素的随机数组，随机数组的大小为[rangeL, rangeR]
  int* generateRandomArray(int len, int rangeL, int rangeR){
    assert(rangeL < rangeR);
    int *arr = new int[len];
    // 设置随机数种子
    srand(time(NULL));
    for(int i = 0; i < len; i++){
      arr[i] = rand() % ( rangeR - rangeL + 1 ) + rangeL;
    }
    return arr;
  }
  // 生成一个近乎有序的数组
  int* generateNearlySortedArray(int len, int swapTimes){
    int *arr = new int[len];
    for(int i = 0; i < len; i++){
      arr[i] = i;
    }
    // 设置随机数种子
    srand(time(NULL));
    // 对有序数组进行随机的交换
    for(int i = 0; i < len; i++){
      int posx = rand() % len;
      int posy = rand() % len;
      swap(arr[posx], arr[posy]);
    }
    return arr;
  }
  int* copyArray(int a[], int n){
    int* arr = new int[n];
    copy(a,a+n,arr);
    return arr;
  }
  template<typename T>
  void printArray(T arr[], int n)
  {
    for(int i = 0;i < n ;i++){
      cout<<arr[i]<<" ";
    }
    cout<<endl;
    return;
  }
  template<typename T>
  bool isSorted(T arr[], int n){
    for(int i = 0; i < n - 1; i++){
      if(arr[i] > arr[i + 1]){
        return false;
      }
    }
    return true;
  }
  template<typename T>
  void testSort(string sortName, void(*sort)(T[], int), T arr[], int n ){
    clock_t startTime = clock();
    sort(arr,n);
    clock_t endTime = clock();
    assert(isSorted(arr,n));
    cout<<sortName<<":"<< double(endTime - startTime) / CLOCKS_PER_SEC<<"s"<<endl;
  }
} // SortTestHelper
